/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package clases;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.FlushModeType;
import javax.persistence.Persistence;

/**
 *
 * @author Miguel_
 */
public class main {

    public main(){}
    
    public Tipo createTipo(String n){
        Tipo ti = new Tipo();
        ti.setNombre(n);
        return ti;
    }
    
    public Nacionalidad createNacionalidad(String n){
        Nacionalidad na = new Nacionalidad();
        na.setNombre(n);
        return na;
    }
    
    public Bebida createBebida(String n, Nacionalidad na)
    {
        Bebida b = new Bebida();
        b.setNombre(n);
        b.setNacionalidad(na);
        return b;
    }
    
    public Producto createProducto(String n){
        Producto p = new Producto();
        p.setNombre(n);
        return p;
    }
    
    public Ingrediente createIngrediente(Producto p, double c, String u)
    {
        Ingrediente i = new Ingrediente();
        i.setProducto(p);
        i.setCantidad(c);
        i.setUnidad(u);
        return i;
    }
    
    public Receta createReceta(String re, String n, String d,Tipo t, Nacionalidad na,
            Collection<Ingrediente> co, Bebida b,int du,double k){
        Receta r = new Receta();
        r.setRef(re);
        r.setNombre(n);
        r.setDificultad(d);
        r.setIngredientes(co);
        r.setTipo(t);
        r.setVino(b);
        r.setNacionalidad(na);
        r.setDuracion(du);
        r.setKcal(k);
        return r;
    }
    
    
    //***************************************************************************
    
    public Vector<Receta> searchTipo(Vector<Receta> recetas,String tipo)
    {
        Vector<Receta> v1 = new Vector<Receta>();
        for(int i=0; i<recetas.size();i++)
           {
                if(recetas.elementAt(i).getTipo().getNombre().equals(tipo))
                     v1.add(recetas.elementAt(i));
           }
        
        return v1;
    }
    
    
    public Vector<Receta> searchKcal(Vector<Receta> recetas,double kcal)
    {
        Vector<Receta> v1 = new Vector<Receta>();
        for(int i=0; i<recetas.size();i++)
           {
                if(recetas.elementAt(i).getKcal()<(kcal+1))
                     v1.add(recetas.elementAt(i));
           }
        
        return v1;
    }
    
    public Vector<Receta> searchDificultad(Vector<Receta> recetas, String dificultad)
    {
        Vector<Receta> v1 = new Vector<Receta>();
        for(int i=0; i<recetas.size();i++)
           {
                if(recetas.elementAt(i).getDificultad().equals(dificultad))
                     v1.add(recetas.elementAt(i));
           }
        
        return v1;
    }
    
    
    public Vector<Receta> searchNacionalidad(Vector<Receta> recetas, String nacionalidad)
    {
        Vector<Receta> v1 = new Vector<Receta>();
        for(int i=0; i<recetas.size();i++)
           {
                if(recetas.elementAt(i).getNacionalidad().getNombre().equals(nacionalidad))
                     v1.add(recetas.elementAt(i));
           }
        
        return v1;
    }
    
    
    public Vector<Receta> searchDuracion(Vector<Receta> recetas, int duracion)
    {
        Vector<Receta> v1 = new Vector<Receta>();
        for(int i=0; i<recetas.size();i++)
           {
                if(recetas.elementAt(i).getDuracion()<(duracion+1))
                     v1.add(recetas.elementAt(i));
           }
        
        return v1;
    }
    
     public Vector<Receta> searchByCriteria(String ing_principal, String tipo, double kcal, 
            String dificultad, String nacionalidad, int duracion)
    {
        Vector<Receta> v1 = new Vector<Receta>(); 
        Vector<Receta> v2 = new Vector<Receta>(); 
      //  Vector<Receta> v3 = new Vector<Receta>();
      //  Vector<Receta> v4 = new Vector<Receta>();
      //  Vector<Receta> v5 = new Vector<Receta>();
      //  Vector<Receta> v6 = new Vector<Receta>();
        
        EntityManagerFactory emf1 = Persistence.createEntityManagerFactory("recetasUnit");
        EntityManager em1;
        em1 = emf1.createEntityManager();
        em1.setFlushMode(FlushModeType.AUTO);
        Vector<Receta> recetas2 = new Vector<Receta>(0,1);
        recetas2 = (Vector<Receta>)em1.createQuery("SELECT r FROM Receta r WHERE r.id>0")
                .getResultList();
        
        if(ing_principal!=null)//SI INTRODUCE INGREDIENTE
        {
            for(int i=0; i<recetas2.size();i++)
            {
                Iterator<Ingrediente> it = recetas2.get(i).getIngredientes().iterator();
                while(it.hasNext())
                {
                    Ingrediente in = it.next();
                    if(in.getProducto().getNombre().equals(ing_principal))
                        v1.add(recetas2.elementAt(i)); //almacen las recetas que tienen ese ingrediente
                } //fin de while  
            } //fin de for
            recetas2 = v1;
        } //fin de ingrediente
        
        if(tipo!=null)
        {
            v2 = searchTipo(recetas2,tipo);
            recetas2=v2;
        }
        
        if(kcal!=0)
        {
            v2 = searchKcal(recetas2,kcal);
            recetas2=v2;
        }
        
        if(dificultad!=null)
        {
            v2 = searchDificultad(recetas2,dificultad);
            recetas2=v2;
        }
        
        if(nacionalidad!=null)
        {
            v2 = searchNacionalidad(recetas2,nacionalidad);
            recetas2=v2;
        }
        
        if(duracion!=0)
        {
            v2 = searchDuracion(recetas2,duracion);
            recetas2=v2;
        }
        return recetas2;
    }//FIN DE FUNCION BUSQUEDA CRITERIOS
    
    
    public void InsertReceta() throws IOException
    {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("recetasUnit");
         EntityManager em;
         
         em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String nombre,nacionalidad,tipo,dificultad,vino,aux,nacionalidad1,unidad="",ingrediente=""; 
        double cantidad = 0;
        int tiempo = 0;
        
        Producto pr;
        Ingrediente in;
        
        em.getTransaction().begin();
        
        System.out.println("A continuación se va a proceder a crear una receta.");
        
        System.out.println("Introduce el nombre de la receta: ");
        System.out.println("Nombre: ");
        nombre = br.readLine();
        
        
        System.out.println("Introduce la nacionalidad de la receta: ");
        System.out.println("Nacionalidad: ");
        nacionalidad = br.readLine();
        Nacionalidad na = createNacionalidad(nacionalidad);
        
        System.out.println("Introduce el Tipo de receta: ");
        System.out.println("Tipo: ");
        tipo = br.readLine();
        br = new BufferedReader(new InputStreamReader(System.in));
        Tipo ti = createTipo(tipo);
        
        System.out.println("Introduce la dificultad de la receta: ");
        System.out.println("Dificultad: ");
        dificultad = br.readLine();
        
        System.out.println("Introduce el nombre del vino que va con la receta, " +
                "y la nacionaliad de este: ");
        System.out.println("Vino: ");
        vino = br.readLine();
        System.out.println("Nacionalidad: ");
        nacionalidad1 = br.readLine();
        Bebida be;
        Nacionalidad na1 = createNacionalidad(nacionalidad1);
        if(nacionalidad1.equals(nacionalidad))
            be = createBebida(vino,na);
        else
            be = createBebida(vino,na1);
        
        Collection<Ingrediente> co1 = new ArrayList();
        System.out.println("Introduce los ingredientes de la receta: ");
        
        String cons="S";
        
        while(cons.equals("S"))
        {
            System.out.println("Ingrediente: ");
            ingrediente = br.readLine();
            if(!ingrediente.equals("exit"))
            {
            System.out.println("Cantidad: ");
            aux = br.readLine();
            StringTokenizer stok = new StringTokenizer(aux);
            cantidad = new Integer(stok.nextToken()).doubleValue();

            System.out.println("Unidad de medida: ");
            unidad = br.readLine();
            }
            
            pr = createProducto(ingrediente);
            in = createIngrediente(pr,cantidad,unidad);
            co1.add(in);
            
            System.out.println("Introducir mas ingredientes (S,N)");
            
            cons= br.readLine();
            
            
        } 
        
        System.out.println("Introduce la duracion de la receta: ");
        System.out.println("Duracion: ");
        aux = br.readLine();
        StringTokenizer stok = new StringTokenizer(aux);
        tiempo = new Integer(stok.nextToken()).intValue();
        
        System.out.println("Introduce las calorias de contiene la receta: ");
        System.out.println("Kilocalorias: ");
        aux = br.readLine();
        stok = new StringTokenizer(aux);
        double calorias = new Integer(stok.nextToken()).doubleValue();

        
        String cod = (String) nombre.subSequence(0, 2);
        
        Receta re = createReceta(cod,nombre,dificultad,ti,na,co1,be,tiempo,calorias);
        
        em.persist(re);
        
        em.getTransaction().commit();
    }
    
    public static void main(String args[]) throws IOException
    {
        
    }
}
